class A:
    pass


class B:
    pass

'''
1. 依赖关系
2. 组合关系(关联组合聚合)
3. 继承关系(明天讲)
'''

# 1.依赖关系(主从关系)

# 大象进冰箱


class Elephant:


    def __init__(self, name):
        self.name = name

    def open(self, ref1):
        # print(ref1)
        print(f'{self.name}默念三声: 芝麻开门')
        ref1.open_door()

    def close(self):
        print('大象默念三声:芝麻关门')



class Refrigerator:


    def __init__(self, name):
        self.name = name

    def open_door(self):
        print(f'{self.name}冰箱门被打开了....')

    def close_door(self):
        print('冰箱门被关上了....')


# ele = Elephant('琪琪')
# ele1 = Elephant('安安')
# ref = Refrigerator('美菱')
# ele.open(ref)
# ele1.open(ref)
# 依赖关系: 将一个类的类名或者对象传给另一个类的方法中.

# 实现两个:
# 大象执行open方法:
# 显示: '哪个大象  大象默念三声: 芝麻开门'
# 显示: '哪个冰箱门 冰箱门被打开了....'

# 关门的流程也需要完成.


# 组合:(聚合,组合,关联)

# class Boy:
#
#     def __init__(self, name):
#         self.name = name
#
#     def meet(self, girl_friend=None):
#
#         self.girl_friend = girl_friend  # wu对象空间 : girl_friend : object对象
#
#     def have_diner(self):  # self = wu这个对象空间
#
#         if self.girl_friend:
#             print(f'{self.name}请年龄为:{self.girl_friend.age},姓名为{self.girl_friend.name}一起吃六块钱的麻辣烫')
#             self.girl_friend.shopping(self)  # (self = wu对象空间)
#         else:
#             print('单身狗,吃什么吃')
#
#
#
# class Girl:
#
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     def shopping(self,boy_friend):
#         print(f'{boy_friend.name},{self.name}一起去购物!')
#
# wu = Boy('吴超')
# # wu.have_diner()
# # flower = Girl('如花', 48)
# # wu.meet('如花')
# flower = Girl('如花', 48)
# # 组合: 将一个类的对象封装成另一个类的对象的属性.
# wu.meet(flower)
#
# wu.have_diner()

# 上面例题的难点:
# 一个类的方法只能有此类的对象去调用.
# 一个类的方法的第一个self只接受此类的对象.


#4. 模拟英雄联盟写一个游戏人物的类（升级题）.
# 要求:
#
# 1. 创建一个 Game_role的类.
# 2. 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
# 3. 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
#        例: 实例化一个对象 盖伦,ad为10, hp为100
#        实例化另个一个对象 剑豪 ad为20, hp为80
#        盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血,  还剩多少血'的提示功能.


class GameRole:

    def __init__(self, name, ad, hp):

        self.name = name
        self.ad = ad
        self.hp = hp

    def attack(self,p1):
        # print(self.name)
        # print(p1.name)
        p1.hp = p1.hp - self.ad
        print(f'{self.name}攻击{p1.name},{p1.name}掉了{self.ad}血,还剩{p1.hp}血')

    def equit_weapon(self,wea):
        # print(wea)
        self.weapon = wea  # 组合: 给gailun这个对象封装了一个为weapon属性,属性值为wea == great_sword对象

class Weapon:

    def __init__(self, name, ad):
        self.name = name
        self.ad = ad

    def weapon_attack(self, p1, p2):
        # print(self)
        p2.hp = p2.hp - self.ad
        print(f'{p1.name}利用{self.name}给了{p2.name}一下,{p2.name}还剩{p2.hp}血')

# gailun = GameRole('草丛伦', 10, 100)
# jianhao = GameRole('风男', 20, 80)
# gailun.attack(jianhao)
# gailun.attack(jianhao)
# gailun.attack(jianhao)


# 利用武器攻击
# gailun = GameRole('盖伦', 10, 100)
# zhaoxin = GameRole('赵信', 20, 90)
# great_sword = Weapon('大保健', 30)
# spear = Weapon('红缨枪', 40)
# great_sword.weapon_attack(gailun, zhaoxin)
# 上面需要解决的问题: 发起武器攻击的发起者应该是人类,而不是great_sword武器对象.
# 但是weapon_attack只能有Weapon类的对象去调用.


gailun = GameRole('盖伦', 10, 100)
zhaoxin = GameRole('赵信', 20, 90)
great_sword = Weapon('大保健', 30)
# print(great_sword)
gailun.equit_weapon(great_sword)  # 依赖关系
# print(gailun.weapon)
# gailun.weapon == great_sword
# great_sword.weapon_attack()
gailun.weapon.weapon_attack(gailun, zhaoxin)



